package com.recursion;


/**
 * @BelongsProject: DataStructures
 * @BelongsPackage: com.recursion
 * @Author: 江岸
 * @CreateTime: 2021-01-26 22:21
 * @Description: 八皇后算法
 */
public class Queen8 {
    //定义皇后个数
    int max = 8;
    //定义一维数组
    int[] arr = new int[8];
    //总数
    static int count = 0;
    public static void main(String[] args) {
        new Queen8().check(0);
        System.out.println("一共有"+count+"种解法");
    }
    //递归方法
    public void check(int n){
        if (n==8){
            //说明摆放完毕，可以输出结果
            print(arr);
            return;
        }
        //循环调用递归,该循环是这一行的每一列在循环
        for (int i=0;i<max;i++){
            //先把第n个皇后放在该行的第一列
            arr[n] = i;
            //判断第n个皇后放到第i列时候，是否冲突
            if (judge(n)){
                //如果不冲突，则继续放n+1个皇后
                check(n+1);
            }
        }
    }
    //判断当前位置是否可以摆放
    public boolean judge(int n){
        for(int i=0;i<n;i++){
            //列相同
            //列差等于行差说明在同一斜线上
            if(arr[i]==arr[n]|| Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
                return false;
            }
        }
        return true;
    }

    public void print(int[] arr){
        count++;
        for (int i=0;i<max;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}
